function AutoComplete(){
	
	// JSON Local carregado com os valores Default.
	this.jsonLocal = {
			"appendTo": null,
			"autoFocus": false,
			"delay": 300,
			"disabled": false,
			"minLength": 1,
			"position": {my: "left top", at: "left bottom", collision: "none"},
			
	};
	
}

/**
 * 
 * @param seletor (Seletor do campo de texto.)
 * 
 * @param url (O nome sendo ouvida pela Servlet. Anotaçoes: O nome do parametro sendo ouvido é "parametroRetorno".)
 * 
 * @param funcao (Função de Retorno do Ajax.)
 * 
 *  function(campo){
 *			
 *		return{
 *				
 *			label:campo.nomeExibicao,
 *			value:campo.valorSelecionado
 *				
 *		};
 *			
 *	}
 * 
 * @param config (Parâmetro que chama os atributos do AutoComplete)
 * 
 * <ul>
 * <li><p><b>AppendTo</b> - Tipo: "Selector" - Se o elemento for nulo, o campo de texto recebe a classe 'ui-front', quando um elemento com essa classe é encontrada, o valor é encontrado no 'banco' 
 * e é mostrado logo abaixo do campo de texto.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>AutoFocus</b> - Tipo: "Boolean" - Quando setado o valor "true", o primeiro elemento do campo 'autocomplete' é mostrado no auto complete.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>Delay</b> - Tipo: "Integer" - Quando o usuario digita qualquer informação no campo de texto, é programado um tempo em milisegundos para ser buscado as informações que serão mostradas no
 * autocomplete, quando o valor do Delay é '0', é porque as informações que estão no autocomplete estão guardadas na máquina do usuário, quanto maior o valor,
 * maior o tempo que ele necessita para buscar as informações no banco (quanto mais informações tem no banco, mais tempo ele precisa).</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>Disabled</b> - Tipo: "Boolean" - Desabilita o autocomplete quando setado true.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>MinLength</b> - Tipo: "Integer" - O valor do minLength determina quantos caracteres serão necessário no minimo para que a pesquisa seja realizada no banco. Ex: com o valor 2,
 * a pessoa precisa digitar "Ab" para que o nome "Abner" seja mostrado no autocomplete.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>Position</b> - Tipo: "Object" - Define qual posição será mostrada o autocomplete, a opção "my" tem o default "center" e define a posição que será mostrada os elementos dentro do autocomplete;
 * a opção "at" tem o default "center" e define como sera a ordem que serão mostrados os elementos do autocomplete; a opção "of" tem o default "null" e define
 * quais os elementos você vai posicionar contra; a opção "collision" tem o default "flip" e define qual o tipo do 'evento' sera mostrado quando o autocomplete
 * for ativado, são 4 opções: flip - fit - flipfit - none.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>Source</b> - Tipo: "Array/String/Function/(Object request, Function response(Object data))" - Define qual o tipo de dados serão utilizados, pode se utilizar multiplos tipos de dados no mesmo autocomplete; a opção "Array" suporta dois tipos de formatos, 
 * sejam eles Array de "String" (Ex: ["Leandro", "Thiago"] ) ou "Object", que é formato por chave e valor (Ex: [{label: "chaveLeandro", value: Leandro"}, ..."] ); a
 * opção "String" trabalha cm a URL do site e retorna um JSON, as opçoes que são desejadas são passadas via GET pela URL (Ex: O nome do campo AutoComplete chama
 * "teste" e o que a pessoa quer digitar é "Leandro", a URL ficaria "http://www.exemplo.com.br?teste=Leandro" ); a opção "Function" trabalha duas formas diferentes,
 * sendo elas o "request", onde o que o usuario pesquisar precisa ser identico ao que esta no 'banco' (Ex: O usuario digita 'a', só irá aparecer o que estiver no
 * 'banco' como 'a' e não 'Alisson, Anderson, André,..."), e o modo "response", onde o que o usuario pesquisar for uma parte do que está no banco, o AutoComplete
 * irá trazer (Ex: O usuario digita 'a' irá buscar no banco 'Alisson, Anderson, Andre,...'). Obs: Não precisa ser informado, ja faz internamente.</p></li>
 * </ul>
 * 
 * <ul>
 * <li><p><b>Select</b> - Tipo: "Event" - Acionado quando um item é selecionado a partir do menu, envia para a servlet o campo selecionado no menu no formato de json. 
 * A ação padrão é substituir o valor do campo de texto com o valor do item selecionado.
 * O cancelamento deste evento impede que o valor seja atualizado, mas não impede que o menu seja fechado.
 * 
 * 
 * </p></li>
 * </ul>
 */
AutoComplete.prototype.autoComplete = function(seletor, className, columnName, columnStatusName, columnStatusValue, atributeStatusName, keyField, keyValue, funcao){
	
	// Carregando o atributo source e select no JSON.
	$.extend(this.jsonLocal,{
		// Cria uma função para o componente source usando Ajax, usando a url informada, o seletor e a funcao de retorno.
		"source": function(request,response){
			$.ajax({
				
				// O Type como GET pois é mais veloz em relação o POST.
				"type": "GET",
				
				// A URL é a combinação do Caminho Relativo (caminhoPath) + "/" + url informada.
				"url": caminhoPath + "/autocomplete",
				
				// O Data atribui o valor digitado no campo para o parametro de retorno usando o seletor informado.
				"data": {
	
					// Atribuição dos Parametros.
					"parameterReturn": $(seletor).val(),
					"className": className,
					"columnName": columnName,
					"columnStatusName":columnStatusName,
					"columnStatusValue":columnStatusValue,
					"atributeStatusName":atributeStatusName,
					"keyField": keyField,
					"keyValue": keyValue,
					
				},
				
				// O Success é chamado apos o retorno da Servlet, rodando um Foreach da funcao informada.
				"success": function(retorno){
						
					// Foreach do Retorno.
					response($.map(retorno,funcao));
	
				}
				
			});
			
		},
		
	});
	
	//Criando o autoComplete carregado com os valores.
	$(seletor).autocomplete(this.jsonLocal);
	
};

AutoComplete.prototype.adicionarAtributo = function(campo){
	 
	//Substitui os valores Default pelo o que o usuario passou, o valor que não for informado, continuará com o Default.
	 $.extend(this.jsonLocal,campo);
	 
};

var autoComplete = new AutoComplete();